Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.04.2012, 18:48
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 182

Отказ от получения данных
Подскажите такой вопросик:
предположим, что на странице есть некоторое текстовое поле, которому на событие onkeyup подвешена функция MyFunc()
Тогда при отпускании клавиши внутри данного поля будет срабатывать указанная функция. Она должна дать запрос на сервер, а потом отобразить результат пользователю. Но сервер довольно долго генерирует ответ. Из-за этого несколько экземпляров функции MyFunc() могут наложиться друг на друга. И последним отобразится самый тяжелый запрос, а не самый последний.
Можно ли как-то "убить" все запущенные экземпляры MyFunc() или всего два способа избежать данного эффекта - либо делать отложенный запрос (а если произошел запуск MyFunc() снова, то полностью прибивать предыдущий запрос до его отправки), либо по какому-то дополнительному условию блокировать вывод инфы пользователю?
Ответить с цитированием
  #2 (permalink)  
Старый 12.04.2012, 18:59
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

После получения полем фокуса ввода начинайте с некоторым интервалом проверять его значение, если значение изменилось, отправляйте запрос на сервер, как только поле теряет фокус, прекращайте действия. У xhr-объекта есть метод abort, с помощью которого можно прерывать выполнение неактуальных запросов.
Ответить с цитированием
  #3 (permalink)  
Старый 13.04.2012, 18:54
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Octane,
я убедился, что описанная Вами практика не очень хороша, потому что периодическая проверка содержимого поля с каким-то интервалом (каким?) начинает ощутимо грузить процессор, а в IE при этом курсор начинает лихорадочно мигать.

demoniqus,
на практике стараются не убить уже отправленные запросы, а не допустить отправку пачки запросов в заданном промежутке времени. Например, при построении механизма "live search" когда пользователь последовательно нажимает буквы поискового слова нужно по keyup запускать таймер времени на 500-700 ms. Если в течение этого времени опять сработало событие keyup, то перезапускать таймер снова. Как только пользователь прекратит набор текста, т.е. в течение 700 ms не нажмет ни одной клавиши, то на сервер будет отправлен один запрос (он же последний).
При этом в некоторых системах всё же возможны ситуации отсылки дубликатов запросов типа http://mysite.ru?x=aaaaaaa и снова http://mysite.ru?x=aaaaaaa. Для этого лично я опробовал механизм стека запросов. Как это работает: перед отправкой запроса его параметры (или вообще полный URL) запоминаются в массиве. Когда формируется следующий запрос, то производится проверка наличия такого же в массиве; если дубликат обнаружен, то второй запрос отбрасывается (не грузим сервер). Соответственно при приеме ответов с сервера Вы должны удалить из стека запросов соответствующий запрос (на который пришел ответ).
Чтобы сильно не запутывать скажу еще, что этот же механизм стека позволяет контролировать ситуацию, когда младший запрос/ответ пришел самым последним (его нужно отбросить). Для этого в стеке надо также хранить время отправки запроса и проверять при приеме ответа с сервера. При этом устаревшие запросы помечаются как ненужные. Когда с сервера приходят запоздавшие ответы, то они уже помечены как устаревшие и пользователю не показываются. Остается только удалить эти запросы из стека.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двойная Фильтрация данных таблицы David0707 Общие вопросы Javascript 0 19.03.2012 13:00
Изменение окраски строк таблицы, исходя из данных? Space-06 Events/DOM/Window 4 14.02.2012 21:32
hta/jscript обновление данных MySQL через ODBC драйвер Space-06 Events/DOM/Window 0 26.12.2011 22:19
Обработка combobox после получения данных. Tie ExtJS 1 02.12.2011 12:06
jqGrid. локальная обработка данных DarkN jQuery 0 25.01.2011 23:55